var express = require('express');
var Msdb = require("../../../db/Mysqldb.js");
var router = express.Router();   // 可使用 express.Router 类创建模块化、可挂载的路由句柄
const os = require('os'); // 引入内置的os模块

var db = new Msdb();
var getTime = () => {
    return new Date(new Date().getTime() + 8 * 60 * 60 * 1000).toISOString().slice(0, 19).replace('T', ' '); // 获取系统时间并转为数据库接受的格式
};

router.get("/getSysInfo", async function (_req, res) { // 获取系统信息
    try {
        // 1. 获取系统配置信息（原有逻辑）
        var result = await db.query(`SELECT * FROM sys WHERE id=1`);
        const sysInfo = result[0] || {};

        // 2. 获取内存信息（新增逻辑）
        const totalMem = os.totalmem(); // 总内存（字节）
        const freeMem = os.freemem();  // 空闲内存（字节）
        const usedMem = totalMem - freeMem;
        const memUsage = Math.round((usedMem / totalMem) * 100); // 内存使用率（%）

        // 3. 整合数据并返回
        res.send(JSON.stringify({
            ...sysInfo,
            memory: {
                total: totalMem,
                free: freeMem,
                used: usedMem,
                usage: memUsage
            }
        }));
    } catch (error) {
        console.error("获取系统信息失败:", error);
        res.status(500).send(JSON.stringify({
            error: "获取系统信息失败",
            message: error.message
        }));
    }
});

router.post("/updateSysInfo", async function (req, res) { // 更新系统信息
    // 获取数据库连接（用于事务）
    const connection = await db.getConnection();
    try {
        var result = {};
        var data = req.body;

        // 1. 验证登录状态
        if (!req.auth || !req.auth.user_id) {
            result = {
                code: 401,
                msg: "请先登录"
            };
            res.send(JSON.stringify(result));
            return;
        }

        // 2. 验证是否为超级管理员（角色ID=1）
        if (req.auth.role_id !== 1) {
            result = {
                code: 201,
                msg: "更新失败，非超级管理员无法更新！"
            };
            res.send(JSON.stringify(result));
            return;
        }

        // 3. 验证必要字段
        if (!data.version) {
            result = {
                code: 202,
                msg: "更新失败，版本号不能为空！"
            };
            res.send(JSON.stringify(result));
            return;
        }

        // 4. 开启事务
        await db.beginTransaction(connection);

        // 5. 执行更新操作
        await connection.execute(
            `UPDATE sys SET name=?, status=?, company_name=?, open_time=?, version=? WHERE id=1`,
            [data.name, data.status, data.company_name, data.open_time, data.version]
        );

        // 6. 记录操作日志（使用token中的用户ID）
        var sql_words = `UPDATE sys SET name='${data.name}', status=${data.status}, company_name='${data.company_name}', 
                         open_time='${data.open_time}', version='${data.version}' WHERE id=1`;
        var time = getTime();
        await connection.execute(
            `INSERT INTO operation_log (user_id, sql_words, time) VALUES (?,?,?);`,
            [req.auth.user_id, sql_words, time] // 使用token中的用户ID
        );

        // 7. 提交事务
        await db.commit(connection);

        result = {
            code: 200,
            msg: "更新成功，重新进入系统可查看更新效果！"
        };
        res.send(JSON.stringify(result));
    } catch (error) {
        // 发生错误时回滚事务
        await db.rollback(connection);
        console.error('更新系统信息错误:', error);
        res.send(JSON.stringify({ code: 500, msg: '服务器错误，更新失败' }));
    } finally {
        // 确保连接释放
        connection.release();
    }
});

module.exports = router;